package top.metaspace.singleton.reflection;

/**
 * @author panjun
 * @date 2018/6/21. 避免反射
 */
public class AvoidReflectionLazySingleton {

	/**
	 *  isInit必须在instance之前声明，否则会产生很诡异的问题
	 */
	public static boolean isInit = false;
	private static AvoidReflectionLazySingleton instance = new AvoidReflectionLazySingleton();


	private AvoidReflectionLazySingleton() {
		//反射破坏单例的原理是，强行调用这个私有的构造方法，那么我们只需要保证这个构造方法只能被调用一次就行了
		if (!isInit) {
			synchronized (AvoidReflectionLazySingleton.class) {
				if (!isInit) {
					//初始化
					isInit = true;
				} else {
					throw new RuntimeException("企图通过反射破坏单例");
				}
			}
		} else {
			throw new RuntimeException("企图通过反射破坏单例");
		}

	}

	public static AvoidReflectionLazySingleton getInstance() {
		return instance;
	}

}
